[R3 复现]Neon Deceit
反调试+迷宫+无用数据+无限循环+函数名异常
main 函数就只是一个 helloworld 然后退出,但是 exit 用来混淆逻辑,动调的时候需要把exit
给 nop 掉,真正的主要逻辑在下面的sub_18597
中。

跟进后发现伪代码逻辑不全,发现是_verrx
混淆逻辑导致输出不全

把_verrx
nop 掉重新分析函数,发现有反调试。先将一个加密过的字符串和 0x5A 进行异或,发现是一些 linux 常用调试器/反编译器的名称,分析这是一个基于名称查找的反调试,下面的cimag
函数实际是退出函数。

这里也是反调试的一环是一个无限循环,这个无限循环在逻辑中出现多次,调试的时候请务必多加小心


启动调试绕过反调试,经过输入之后,我们会这里的逻辑,其中 var_6980
存放着迷宫地图,var_6970
是存放着输入字符长度的地方,var_6968
是var_6970/2
可能要进行什么操作

迷宫地图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ################################################### # # # # # # ##### ### # # # ####### # # # ####### # ### # # # # # # # # # # # # # # # # # # ### ### # # # ########### # # # # # ########### # # # # # # # # # # # # # # # # # # # # # # # # ### # # # # # ##### # # ### ##### # # # # # # # # # # # # # # # # # # # # # # ### # # # # ##### # ### # ########### ####### # # # # # # # # # # # # # # # # # # # # # # # ######################### # # # # # # # # # # # # # # # # # # ####### ############# ##### # # # ### # ### ### # # # # # # # # # # # # # # # # # # ############# ########################### # # # # # # # # ### # # # # ### # # # # # # # # # # ### ### ### # # # # # # # # # # # # # # # # # # # # # # # # ##### # # # # ##### # # # # # ### # # # # # # # # # # # # # # # # # # # # # # # # # # # ###################################################
|
整理后的地图及其路线和键盘输入:ffffffffffffd7d5556aa97d7ffffffffffffd57
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ███████████████████████████████████████████████████ dddddddddddddddddddddddddd█ █ █ █ █ █ █████ ███ █ █ █ ███████s█ █ █ ███████ █ ███ █ █ █ █ █ █ █ █ █ █ █ sdd █ █ █ █ █ █ █ ███ ███ █ █ █ ███████████s█ █ █ █ █ ███████████ █ █ █ █ █ █ █ █ █ █ █s█ █ █ █ █ █ █ █ █ █ █ █ █ ███ █ █ █ █ █s█████ █ █ ███ █████ █ █ █ █ █ █ █ █ █ █ █ █ s█ █ █ █ █ █ █ █ █ █ ███ █ █ █ █ █████ █ ███s█ ███████████ ███████ █ █ █ █ █ █ █ █ █ █ █s█ █ █ █ █ █ █ █ █ █ █ █ █████████████████████████ █s█ █ █ █ █ █ █ █ █ █ █ █ █ aaaaaas █ █ █ █ ███████ █████████████s█████ █ █ █ ███ █ ███ ███ █ █ █ █ sdd█ █ █ █ █ █ █ █ █ █ █ █ █ █ █████████████s███████████████████████████ █ █ █ █ █ █ sdddddddddddddddddddddddddd█ █ ███ █ █ █ █ ███ █ █ █ █ █ █ █ █ █ █ ███ ███ ███s█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ s█ █ █ █████ █ █ █ █ █████ █ █ █ █ █ ███ █ █ █ █ █ █s█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █sd ███████████████████████████████████████████████████
|
经过调试我们可以知道下图左半部分是 flag 输出部分,右半部分是迷宫校验部分,
校验逻辑是带入的每个字节被拆分成 4 个 2 位 bit,按大端序排列,每个 2 位 bit 控制迷宫走向,00 为 w,01 为 s,10 为 a,11 为 d,var_6938 为当前 Y 轴,var_6938+4 为当前 X 轴
左半部分是校验部分

把刚才的正确迷宫路线的字母带换成二进制的硬编码然后转换成 16 进制:ffffffffffffd7d5556aa97d7ffffffffffffd57
1 2 3 4 5 6 7 8 9 10 11
| direction_str = "dddddddddddddddddddddddddssddssssssssaaaaaassddssddddddddddddddddddddddddddssssd" direction_map = { 'd': '11', 'w': '00', 's': '01', 'a': '10' } binary_str = ''.join(direction_map[ch] for ch in direction_str) byte_list = [binary_str[i:i+8].ljust(8, '0') for i in range(0, len(binary_str), 8)] hex_str = ''.join(f"{int(b, 2):02x}" for b in byte_list) print(hex_str)
|